package catch

import (
	"fmt"
	"gitee.com/manoshi/go-util/exception"
	"gitee.com/manoshi/go-util/getWay"
	"gitee.com/manoshi/go-util/log"
	"github.com/gin-gonic/gin"
	"runtime"
	"strings"
	"sync"
)

func ExceptionCatchWithWg(c *gin.Context, wg *sync.WaitGroup) {
	wg.Done()
	err := recover() //获取异常
	if err != nil {
		switch err.(type) {
		case exception.DError:
			e := (err).(exception.DError)
			if c == nil {
				log.Errorf("%s-%s", e.Code, e.Err)
			} else {
				getWay.FailAndMsg(c, e.Code, e.Err)
			}
			break
		case error:
			e := (err).(error)
			if c == nil {
				log.Error(e.Error())
			} else {
				getWay.FailAndMsg(c, "SYSTEM.ERROR", transformError(e.Error()))
			}
			printStack()
			break
		case string:
			e := (err).(string)
			if c == nil {
				log.Error(e)
			} else {
				getWay.FailAndMsg(c, "SYSTEM.ERROR", e)
			}
			printStack()
			break
		default:
			if c != nil {
				getWay.FailAndMsg(c, "SYSTEM.ERROR", "系统繁忙...")
			}
			printStack()
			break
		}
	}
}
func ExceptionCatch(c *gin.Context) {
	err := recover() //获取异常
	if err != nil {
		switch err.(type) {
		case exception.DError:
			e := (err).(exception.DError)
			if c == nil {
				log.Errorf("%s-%s", e.Code, e.Err)
			} else {
				getWay.FailAndMsg(c, e.Code, e.Err)
			}
			break
		case error:
			e := (err).(error)
			if c == nil {
				log.Error(e.Error())
			} else {
				getWay.FailAndMsg(c, "SYSTEM.ERROR", transformError(e.Error()))
			}
			printStack()
			break
		case string:
			e := (err).(string)
			if c == nil {
				log.Error(e)
			} else {
				getWay.FailAndMsg(c, "SYSTEM.ERROR", e)
			}
			printStack()
			break
		default:
			if c != nil {
				getWay.FailAndMsg(c, "SYSTEM.ERROR", "系统繁忙...")
			}
			printStack()
			break
		}
	}
}

func printStack() {
	var buf [2048]byte
	n := runtime.Stack(buf[:], true)
	fmt.Println(string(buf[:]), n)
}

func transformError(err string) string {
	if len(err) > 0 {
		if strings.Contains(err, "Duplicate entry") {
			k := "Duplicate entry "
			starIdx := strings.Index(err, k)
			endIdx := strings.Index(err, " for key")
			return err[len(k)+starIdx:endIdx] + "重复"
		}
	}
	return err
}

func GetErrorMsg(err any) string {
	if err != nil {
		switch err.(type) {
		case exception.DError:
			e := (err).(exception.DError)
			return e.Err
			break
		case error:
			e := (err).(error)
			return e.Error()
			break
		case string:
			e := (err).(string)
			return e
			break
		default:
			return "系统异常"
			break
		}
	}
	return ""
}
